put('util',function(){
	var isArray = function( ar ){ return Object.prototype.toString.call( ar ) === '[object Array]' ; } ;
	var isObj = function( obj ){ return typeof( obj )=== 'object' && !isArray(obj); } ;
	var copy = function(obj){
		
		if( isObj( obj ) || ( isArray( obj ) ) ){	
		
			var returnObj = null , i ;
			
			if(isArray(obj)){
				returnObj = [] ;
				for( i = 0 ; i < obj.length ; i++ ){
					returnObj[i] = copy( obj[i] ) ;
				}
			}
			
			if(isObj(obj)){
				returnObj = {} ;
				for( i in obj ){
					returnObj[i] = copy( obj[i] ) ;
				}
			}
				
			return returnObj ;
			
		} else {
			return obj ;
		}
		
	} ;
	return {
		copy : copy ,
		isNum : function( num ){ return typeof( num ) === 'number' ; } ,
		isStr : function( str ){ return typeof( str ) === 'string' ; } ,
		isArray : isArray ,
		isObj : isObj ,
		isFunc : function( func ){ return typeof( func )=== 'function' ; } 
	} ;
}) ;

put('Event',['util'],function(){
	//事件模型关键字
	var EventKeyWord = { 'on' : true , 'emit' : true , 'off' : true } ;
	//事件模型
	var Event = {
		
			//事件注册函数
			on : function( type , callback ){
				
				if( isFunc( type ) ){
					callback = type ;
					type = 'any' ;
				}
				
				if( type in EventKeyWord || !isStr(type) ){
					return false ;	
				}
				
				var list = this[type] || ( this[type] = [] ) ;
				
				if( isFunc( callback ) ) { list.push( callback ) ;}
				
				return true ;
			} ,
			
			//事件触发函数
			emit : function( type , data ){
				if( arguments.length === 1 ){
					data = type ;
					type = 'any' ;	
				}
				var list = null ;
				if( type in this && !( type in EventKeyWord ) ){
					list = this[type] || [] ;
					for( var i = 0 ; i < list.length ; i++ ){
						list[i]( data ) ;
					}
				}
				return true ;
			} ,
			
			//事件卸载函数
			off : function(type){
				if(type===undefined){type='any';}
				if( type in this && !(type in EventKeyWord) ){
					var list = this[type] ;
					list.splice(0,list.length);
				}
			}
	};
	return function(){
		return util.copy(Event) ;
	} ;
}) ;